package com.klun.project.common.constans.leetcode;

import com.klun.project.common.constans.utils.ParseUtils;

import java.util.HashSet;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Set;

//给你一个整数 n ，请你找出并返回第 n 个 丑数 。
// 丑数 就是只包含质因数 2、3 和/或 5 的正整数。
// 示例 1：
//输入：n = 10
//输出：12
//解释：[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
// 示例 2：
//输入：n = 1
//输出：1
//解释：1 通常被视为丑数。
// 提示：
// 1 <= n <= 1690
// Related Topics 哈希表 数学 动态规划 堆（优先队列）

public class Solution264 {
	// 最小堆 todo
	public int nthUglyNumber(int n) {
		int[] factors = {2, 3, 5};
		Set<Long> seen = new HashSet<Long>();
		PriorityQueue<Long> heap = new PriorityQueue<>();
		seen.add(1L);
		heap.offer(1L);
		int ugly = 0;
		for (int i = 0; i < n; i++) {
			long cur = heap.poll(); // 队列首位值取出
			ugly = (int) cur;
			for (int factor : factors) {
				long next = cur * factor;
				if (seen.add(next)) {
					heap.offer(next);
				}
			}
		}
		return ugly;
	}

	public static void main(String[] args) {
		Solution264 solution = new Solution264();
		List<List<Integer>> arrayLists = ParseUtils.stringToIntLists("[[2],[3,4],[6,5,7],[4,1,8,3]]");
//		System.out.println(solution.rob(new int[]{2, 7, 9, 3, 1}));
		System.out.println(solution.nthUglyNumber(10));
	}

}
